package cn.csq.threaddemo;

/**
 * @author csq
 * @version 1.0.0
 * @ClassName StackAreaDemo.java
 * @Description TODO
 * @createTime 2021年12月07日 22:24:00
 */
public class StackAreaDemo {

    public static void main(String args[]) throws InterruptedException {
        System.out.println("当前线程名称：" + Thread.currentThread().getName());
        System.out.println("当前线程ID：" + Thread.currentThread().getId());
        System.out.println("当前线程状态：" + Thread.currentThread().getState());
        System.out.println("当前线程优先级：" + Thread.currentThread().getPriority());
        int a = 1, b = 1;
        int c = a / b;
        anotherFun();
        Thread.sleep(10000000);
    }

    private static void anotherFun() {
        int a = 1, b = 1;
        int c = a / b;
        anotherFun2();
    }

    private static void anotherFun2() {
        int a = 1, b = 1;
        int c = a / b;
    }
    //在Java中，执行程序流程的重要单位是“方法”，而栈内存的分配单 位是“栈帧”（或者叫“方法帧”）。方法的每一次执行都需要为其分配一 个栈帧（方法帧），栈帧主要保存该方法中的局部变量、方法的返回地 址以及其他方法的相关信息。当线程的执行流程进入方法时，JVM就会
    //为方法分配一个对应的栈帧压入栈内存；当线程的执行流程跳出方法 时，JVM就从栈内存弹出该方法的栈帧，此时方法帧的局部变量的内存 空间就会被回收。

    //内存。该示例中定义了三个方法——main、anotherFun和 anotherFun2，这三个方法有相同的三个局部变量a、b和c。整体的执行 流程如下： （1）当执行到main()方法时，JVM为main()方法分配一个栈帧，保 存三个局部变量，然后将栈帧压入main线程的栈内存。接着，main()方 法还没有执行完，执行流程进入anotherFun()方法。 （2）执行流程进入anotherFun()方法之前JVM为其分配对应的栈 帧，保存其三个局部变量，然后压入main线程的栈内存。 （3）执行流程进入anotherFun2()方法，老样子，JVM为 anotherFun2()分配对应的栈帧，保存其三个局部变量，然后将帧压入 main线程的栈内存。
    //进入anotherFun2()后，main线程含有三个帧，其栈结构如图1-4所 示。
    //三个方法的栈帧弹出的过程与压入的过程刚好相反。anotherFun2() 方法执行完成后，其栈帧从main线程的栈内存首先弹出，执行流程回到 anotherFun()方法。anotherFun()方法执行完成后，其栈帧从main线程的 栈内存弹出之后，执行流程回到main()方法。main()方法执行完成后， 其栈帧弹出，此时main线程的栈内存已经全部弹空，没有剩余的栈帧。 至此，main线程结束。 正是由于栈帧（方法帧）的操作是后进先出的模式，这也是标准的 栈操作模式，因此存放方法帧的内存也被叫作栈内存。

}
